package com.qen.conditions;

import com.qen.common.SqlHelper;
import com.qen.interfaces.SFunction;
import com.qen.repository.BaseDao;
import com.qen.wrapper.Wrapper;

/**
 * @author licz
 * @data 2025年05月26日 8:38 AM
 */
public interface ChainWrapper<T> {

    /**
     * 获取 BaseDao
     *
     * @return BaseDao
     */
    BaseDao<T> getBaseDao();

    /**
     * 获取最终拿去执行的 Wrapper
     *
     * @return Wrapper
     */
    Wrapper<T> getWrapper();

    /**
     * 获取当前实体Class
     *
     * @return Class
     */
    Class<T> getEntityClass();

    /**
     * 执行baseDao操作，有baseDao操作时使用baseDao，没有时通过entityClass获取baseDao，再使用
     *
     * @param function 操作
     * @param <R>      返回值
     * @return 结果
     */
    default <R> R execute(SFunction<BaseDao<T>, R> function) {
        BaseDao<T> dao = getBaseDao();
        if (dao != null) {
            return function.apply(dao);
        }
        return SqlHelper.execute(getEntityClass(), function);
    }
}
